package controller;

import helper.AbstractAction;
import helper.ParseUtil;

import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import view.KontobewegungenDialog;
import bank.Konto;
import bank.Kontobewegung;
import bank.Kunde;


public class KontobewegungenDialogController {

    private final BankHandler bankHandler;
    private final Frame parent;

    private KontobewegungenDialog dialog;


    public KontobewegungenDialogController(BankHandler aBankHandler, Frame aParent) {
        bankHandler = aBankHandler;
        parent = aParent;
    }

    public void start() {
        dialog = new KontobewegungenDialog(parent, true);
        initActions();
    }

    public void start(int aKundennummer) {
        dialog = new KontobewegungenDialog(parent, true, aKundennummer);
        initActions();
        dialog.getBtZeigeKontobewegungen().doClick();
    }

    private void initActions() {
        dialog.getBtZeigeKontobewegungen().addActionListener(new KontobewegungenAnzeigenAction());
        dialog.getBtEnde().addActionListener(new BeendenAction());
        dialog.getKontenTable().addMouseListener(new KontoTableMouseListener());
        dialog.getKontenTable().getSelectionModel().addListSelectionListener(new KontoSeletionChangeHandler());
    }

    private void showKontobewegungenForSelectedKonto() {
        List<Kontobewegung> kontobewegungen = null;
        int selectedRow = dialog.getKontenTable().getSelectedRow();
        if (selectedRow >= 0) {
            Konto konto = dialog.getKontoUebersichtTableModel().getKonten().get(selectedRow);
            kontobewegungen = konto.getMeineKontobewegungen();
        }
        dialog.getKontobewegungenTableModel().setKontobewegungen(kontobewegungen);
    }


    // Inner Classes ***********************************************************

    private class KontobewegungenAnzeigenAction extends AbstractAction {
        @Override
        protected void execute(ActionEvent aEvent) throws Exception {
            int kundennummer = ParseUtil.parseKundennummer(dialog.getTfKundennummer().getText());
            Kunde kunde = bankHandler.getKundeByKundenNummer(kundennummer);
            dialog.getKontoUebersichtTableModel().setKonten(kunde.getKontenListe());
            if (dialog.getKontoUebersichtTableModel().getRowCount() > 0) {
            	dialog.getKontenTable().getSelectionModel().setSelectionInterval(0, 0);
            }
        }
    }

    private class BeendenAction extends AbstractAction {
        @Override
        protected void execute(ActionEvent aEvent) throws Exception {
            dialog.dispose();
        }
    }

    private class KontoSeletionChangeHandler implements ListSelectionListener {
		@Override
		public void valueChanged(ListSelectionEvent e) {
			showKontobewegungenForSelectedKonto();
		}
    }

    private class KontoTableMouseListener implements MouseListener {
        @Override
        public void mouseClicked(MouseEvent e) {
        	showKontobewegungenForSelectedKonto();
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    }
}
